package com.aynu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/*
* 1.导入mybatis-plus ，在common中
* 2.配置
*   2.1 配置数据源
*       1）数据库驱动
*       2)配置数据源相关信息，在application.yml中
*   2.2 配置mybatis-plus
*       1)配置 @MapperScan
*       2）
*
*3.逻辑删除
*   1）配置全局逻辑删除规则（高版本可省略）
*   2）配置逻辑删除的组件（高版本可省略）
*   3）加上逻辑删除注解@TableLogic，在bean的字段上
*
* 4、JSR303
*   1)添加检验注解，在bean上，并定义自己的message的信息
*   2）开启校验功能@Valid，效果：校验错误以后有默认的响应
*   3）给校验的bean后紧跟一个BindingResult，就可以获得校验结果
*   4)、分组校验（多场景的复杂校验）
*       1、@NotBlank(message = "品牌名必须提交",groups = {UpdateGroup.class,AddGroup.class})，
*           给校验注解标注什么情况需要进行校验
*       2、@Validated({AddGroup.class}) 加上注解，表明使用哪个分组
*       3、默认没有指定分组的校验注解，在不分组的情况下不生效，只会只有@Validated单个注解，没有属性值的生效
*
* 5、自定义校验
*   1、编写一个自定义校验注解
*   2、编写一个自定义校验器 实现接口ConstraintValidator
*   3、关联自定义的校验器和自定义校验注解
*   //Documented注解表明这个注解是由 javadoc记录的，在默认情况下也有类似的记录工具。 如果一个类型声明被注解了文档化，它的注解成为公共API的一部分。
    @Documented
    //@Constraint使用哪个校验器，如果不指定，就在初始化的时候指定
    @Constraint(validatedBy = {ListValueConstraintValidator.class})【可以指定多个不同的校验器，适配不同类型的校验】
    //@Target注解可以标注在哪些位置 （FIELD：属性）
    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
            ElementType.PARAMETER, ElementType.TYPE_USE})
    //@Retention，这个注解可以在运行时获取到
    @Retention(RetentionPolicy.RUNTIME)
*
* 6、统一异常处理
* @ControllerActive
*   1、编写异常处理类，@ControllerActive
*   2、在方法上使用@ExceptionHandler标注方法，来处理特定异常
*
* 7、模板引擎
*   1）、thymeleaf-starter：关闭缓存
*   2）、静态资源放在static文件夹下就可以按照路径直接访问
*   3）、页面放在templates下，直接访问
*       springboot，访问项目的时候,默认寻找默认文件夹
*   4）、页面修改不重启服务器实时更新
*       1）引入dev_tools
*       2)修改完页面ctrl + sheft + f9重新编译下页面，代码配置，推荐重启
* 8、整合redis
*   1）、引入data-starter-redis
*   2)、简单配置redis的host等信息
*   3）、使用SpringBoot自动配置好的StringRedisTemplate来操作redis，redis->map:存放数据的值
* 9、整合redisson作为分布式锁等功能框架
*   1）、引入依赖
*   2）、配置redisson
*       MyRedissonConfig中配置一个redissonClient实例
*   3)、使用：参照官方文档
* 10、整合springCache
*   1）、spring-boot-starter-cache，spring-boot-starter-data-redis
*   2）、写配置
*       1)、自动配置哪些
*       cacheAutoConfiguration导入 【RedisCacheConfiguration】，
*       springboot以自动配置好了缓存管理器【RedisCacheManager】
*   3）、使用注解：
*       @Cacheable: Triggers cache population.（触发将数据保存到缓存的操作）
*       @CacheEvict: Triggers cache eviction.（触发将数据从缓存删除的操作）
*       @CachePut: Updates the cache without interfering with the method execution.（在不影响方法执行的情况下更新缓存）
*       @Caching: Regroups multiple cache operations to be applied on a method.（重新组合以上多种操作）
*       @CacheConfig: Shares some common cache-related settings at class-level.（在类级别共享一些与缓存相关的常见配置）
*       1）、开启缓存功能
*           @EnableCaching，开启缓存
*           @category，在方法上加上，进行缓存
*   4）、原理：
*       CacheAutoConfiguration -> RedisCacheAutoConfiguration ->
*       自动配置了RedisCacheManager -> 初始化所有的缓存 -> 每一个缓存决定了使用什么配置
*       -> 如果redisCacheConfiguration有就用己有的,没有就用默认的配置
*       -> 想改缓存的位置,只需要给容器中放一个redisCacheConfiguration即可
*       -> 就会应用到当前redisCacheConfiguration管理的所有缓存分区中
* */
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.aynu.gulimall.product.feign")
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.aynu.gulimall.product.dao")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
